public class Main {
    public static void main(String[] args) {
        // for(int i=1;i<=5;i++){//i表示行数，k表示该行*的个数
        // 	for(int k=1;k<=5;k++){
        // 		System.out.print("*");//注意区分println和print的区别：前者是打印又换行，光标移动到第二行的开头，而后者是只打印不换行，光标处于该行的末尾
        // 	}
        // 	System.out.println();//基础的边长为5的正方形
        // }
        // *
        // **
        // ***
        // ****
        // *****
        // for(int i=1;i<=5;i++){
        // 	for(int j=1;j<=i;j++){
        // 		System.out.print("*");
        // 	}
        // 		System.out.println();//
        // }
        // 打印一个金字塔
        // for(int i=1;i<=5;i++){
        // 	//在打印星号之前，处理好空格的输入
        // 	for(int k=1;k<=5-i;k++){
        // 		System.out.print(" ");
        // 	}
        // 	for(int j=1;j<=2*i-1;j++){
        // 		System.out.print("*");
        // 	}
        // 	System.out.println();
        // }
        // 打印一个空心金字塔
        // 对于空心要处理好内层的*号不被输出，可利用条件语句来控制*的输出
        // 可以定义一个变量，使代码活起来
//        int High = 4;
//        for (int i = 1; i <= High; i++) {
//            for (int k = 1; k <= High - i; k++) {
//                System.out.print(" ");
//            }
//            for (int j = 1; j <= 2 * i - 1; j++) {
//                if (j == 1 || j == 2 * i - 1 || i == High) {
//                    System.out.print("*");//此处是当第一个元素或最后一个元素或最后一行打印*
//                } else {
//                    System.out.print(" ");//否则打印空格
//                }
//            }
//            System.out.println();
//
//        }
//    }
// }

        //进阶，打印一个空心菱形
        int High = 7;//对于菱形行数必须是奇数
        int mid=High/2+1;
        //方法一：
        for( int i=1;i<=High;i++){
            for(int k=1;k<=Math.abs(mid-i);k++){//此处思维的建立，对于上述的空心三角形，扩展思维，对于之前学c语言的想法是先写上层再下下层，这次做一个挑战
                System.out.print(" ");//Math.abs(mid-i)表示当前行i到中间行的距离，所差的距离就是对应的空格数
            }
            for(int j=1;j<=(2*(mid-Math.abs(mid-i))-1);j++){//对于mid-Math.abs(mid-i)公式是最难理解的，我们知道Math.abs(mid-i)表示当前行i到中间行的距离，则
                //mid-Math.abs(mid-i)表示该行相对于中间行所在的位置，例如第一行，第一行相对于中间行的位置是第一个，第二行相对于中间行的位置是第二个..根据对称，第7行相对于中间行的位置是第一个
                //举一个生活中的例子，一个山坡，从一侧上去再从另一侧下去，当上坡时，你是第一行，距离山顶有3行距离，相对于山顶是第一行，当下坡时，当到第7行，你距离山顶有3行距离，根据对称，相对于山顶是第一行
                //简单来说，mid - Math.abs(mid - i) 是一个对称的计算公式，它帮助我们动态计算每一行的星号数量，确保菱形的形状是对称的。
                if(j==1||j==2*i-1||(j == (2*(mid-Math.abs(mid-i)))-1)){//(2*(mid-Math.abs(mid-i))-1)此公式的解释：计算当前行的星号数量，并判断是否位当前行对后一个数,与前面打印空心三角形中的2*i-1类似
                    System.out.print("*");
                }
                else{
                    System.out.print(" ");
                }

            }
            System.out.println();
        }
    }
        }
        //就目前而言，此方法难度对我来说很大

        //方法二：
        //就是我所说的先按上面再按下面
//        int High = 7;//表示菱形的高度
//        int Mid= High/2+1;//表示菱形的中间
//        for(int i=1;i<=Mid;i++){
//            for(int k=1;k<=Mid-i;k++){//搭建上层，从第一行打印到第4行
//                System.out.print(" ");
//            }
//            for(int j=1;j<=2*i-1;j++){
//                if(j==1||j==2*i-1){
//                    System.out.print("*");//只有第一个位置和最后一个位置打印*
//                }
//                else{
//                    System.out.print(" ");//其余位置打印空格
//                }
//            }
//            System.out.println("");//每次循环后换行
//        }
//        for(int i=Mid-1;i>=1;i--){//倒着打印，由于菱形对称原则，从第四行打印到第一行和第一行打印到第四行的效果一样
//            for(int k=1;k<=Mid-i;k++){
//                System.out.print(" ");
//            }
//            for(int j=1;j<=2*i-1;j++){
//                if(j==1||j==2*i-1){
//                    System.out.print("*");
//                }
//                else {
//                    System.out.print(" ");
//                }
//            }
//            System.out.print("\n");
//
//        }
//
//    }
//}




